package it.vgnf.ejb3.utils;

import it.vgnf.ejb3.beans.MovimentoMonetario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.DataSource;

public class DBManagement {

    private Connection connection;
    private DataSource ds;

    public DBManagement(DataSource ds) {
        this.ds = ds;
        setConnection();
    }

    public List<MovimentoMonetario> getListaMovimentiMonetari() throws MovimentoMonetarioException {
        List<MovimentoMonetario> movimenti = new ArrayList();
        try {
            PreparedStatement ps = connection.prepareStatement("select * from MOVIMENTI");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                MovimentoMonetario movimento = new MovimentoMonetario();
                movimento.setIdMovimento(rs.getInt("id_movimento"));
                movimento.setDataMovimento(rs.getDate("data_movimento"));
                movimento.setDescrizioneMovimento(rs.getString("descrizione_movimento"));
                movimento.setImporto(rs.getDouble("importo"));
                movimento.setNote(rs.getString("note"));
                movimenti.add(movimento);
            }
            rs.close();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
            throw new MovimentoMonetarioException("errore in getListaMovimentiMonetari: " + ex.getMessage());
        }
        return movimenti;

    }

    public void deleteMovimento(int idMovimento) throws MovimentoMonetarioException {
        try {
            PreparedStatement ps = connection.prepareStatement("delete from MOVIMENTI where id_movimento=?");
            ps.setInt(1, idMovimento);
            ps.execute();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
            throw new MovimentoMonetarioException("errore in deleteMovimento: " + ex.getMessage());
        }
    }

    public void insertMovimento(MovimentoMonetario movimentoMonetario) throws MovimentoMonetarioException {
        int nextIdMovimento = getMaxIdMovimento() + 1;
        try {
            PreparedStatement ps = connection.prepareStatement("insert into MOVIMENTI (id_movimento,data_movimento,descrizione_movimento,importo, note) values(?,?,?,?,?)");
            ps.setInt(1, nextIdMovimento);
            ps.setDate(2, movimentoMonetario.getDataMovimento());
            ps.setString(3, movimentoMonetario.getDescrizioneMovimento());
            ps.setDouble(4, movimentoMonetario.getImporto());
            ps.setString(5, movimentoMonetario.getNote());
            ps.executeUpdate();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
            throw new MovimentoMonetarioException("errore in insertMovimento: " + ex.getMessage());
        }
    }

    public void updateMovimento(MovimentoMonetario movimentoMonetario) throws MovimentoMonetarioException {
        try {
            PreparedStatement ps = connection.prepareStatement("update MOVIMENTI set importo=?, data_movimento=?, descrizione_movimento=?, note=? where id_movimento=?");
            ps.setDouble(1, movimentoMonetario.getImporto());
            ps.setDate(2, movimentoMonetario.getDataMovimento());
            ps.setString(3, movimentoMonetario.getDescrizioneMovimento());
            ps.setString(4, movimentoMonetario.getNote());
            ps.setInt(5, movimentoMonetario.getIdMovimento());
            ps.executeUpdate();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
            throw new MovimentoMonetarioException("errore in updateMovimento: " + ex.getMessage());
        }
    }

    private int getMaxIdMovimento() throws MovimentoMonetarioException {
        int idMovimento = 0;
        try {
            PreparedStatement ps = connection.prepareStatement("select max(id_movimento) from MOVIMENTI");
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                idMovimento = rs.getInt(1);
            }
            rs.close();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
            throw new MovimentoMonetarioException("errore in getMaxIdMovimento: " + ex.getMessage());
        }
        return idMovimento;
    }

    private void setConnection() {
        try {
            connection = ds.getConnection();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void closeConnection() {
        try {
            connection.close();
        } catch (SQLException ex) {
            Logger.getLogger(DBManagement.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
